package com.gxa.utils.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
 * 利用Java中单例设计模式完成对数据库连接池的封装
 * 目的：
 * 1. 保证DBConnection类为外部其他提供唯一一个实例对象
 * 2. 保证将DataSource数据源能够不暴露给外部类使用
 * 3. 保证提供统一的Connection会话对象
 * 4. 保证提供统一的Connection对象的资源关闭的操作
 * @author Administrator
 *
 */
public class DBConnection {

    //连接数据库的URL地址
    private static final String URL = "jdbc:mysql://localhost:3306/financial_cashier_system?useUnicode=true&characterEncoding=UTF-8&useSSL=false";
    //连接数据库的用户名称
    private static final String USER = "root";
    //连接数据库的密码
    private static final String PASSWORD = "123456";

    private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

    static{
        //1.加载驱动程序.
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库的会话
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        Connection conn = tl.get(); //通过线程来获取当前线程中的数据库会话对象
        if (conn == null) {
            conn = DriverManager.getConnection(URL, USER, PASSWORD);//尝试建立与给定数据库URL的连接。
            tl.set(conn); //将新的Connection对象放入到线程里面
        }
        return conn;
    }

    /**
     * 对数据库的会话进行资源的关闭
     * @throws SQLException
     */
    public static void closeConnection() throws SQLException {
        Connection conn = tl.get();
        if (conn != null && !conn.isClosed()) {
            conn.close();
            tl.remove();
        }
    }

}
